CF 快乐板刷之路
$CF1396E-Distance Matching$
这种极易停止撕烤的题先考虑有无解。即求答案范围。
$dist(x, y) = dis_x + dis_y - 2 dis_{lca(x, y)}$
最小化 lca $dis$ 之和,尽量在浅的点配完
!根据某经典模型,选重心可以配完并且 lca 都是重心。同理求得 $minans$。
$maxans - k$ 显然必须是 $2$ 的倍数。否则设 $rest = (maxans - k) / 2$,显然可以通过不断选大小最大的子树的一对点配对使得 $rest$ 变小。模拟?😅
可以将某些非叶子节点变成 lca。具体来说:
- $rest \geq$ 大小最大的子树深度 $d$ 时,选该子树最深的那对兄弟或父亲,$rest -= d - 1$ (I)
- 否则令深度 $rest$ 的点为 lca (II)
细节:
- set 维护重心所有子树的大小和 id,方便找最大子树
- 对每个子树开一个 set 维护子树中点的深度和 id,方便找最深点
- 只有一次是 II 情况,其余都是 I,I 显然每次删的都是两个叶子的父亲或一个叶子和它的父亲,所以点匹配掉要记得将父亲度数减一(还要从父亲的叶子集合里删掉,但是想要快速删除就要多个 log,还是懒惰删除更香一点,即遇见时删除),父亲成为叶子就把父亲从备选深度集合里踢掉。
$CF1322E-Median Mountain Range$
中位数问题,想到「01 序列」基本这题就只剩代码难度了。
我们把长度 $> 1$ 的 0 和 1 称为 0 段和 1 段,0、1 交错出现的称为 01 段。
显然 0 段和 1 段是稳定的,
01 交错出现部分每次操作会两边各缩进去一个单位。
拓展,$\leq x$ 为 1,$> x$ 为 0。某位取值为 $a$,当且仅当 $x = a$ 时该位置的终态改变。
从小到大枚举 $x$。操作次数 $=$ 所有 $x$ 的操作次数 $max$,因为实际操作序列肯定存在最后一步,当 $x =$ 最后一步的中位数时取到 $max$。
细节:
每次 0 -> 1 可能会让 0 段和 01 段变为 01 段和 1 段。每次操作只会至多出现一个 01 段需要赋值。
- 并查集维护同色块,set 维护同色对的位置(这俩方便确定 01 交错段的端点坐标)
- set 维护 0 的位置,防止对 01 交错段中的 0 重复赋值(赋值指 $ans = x$)。
$CF1481F-AB Tree$
考虑枚举答案。设最大深度为 $l$,那么答案下界为 $l$,当且仅当每个深度颜色相同。
背包?物品种类 $O(\sqrt{n})$ 级别,也就是说 $O(n \sqrt{n})$ 的复杂度即可判断答案能否为 $l$。$dp[x, i]$ 表示前 $x$ 种物品填了 $i$ 个 a,bitset + 多重背包
然后呢?
官解告诉我们上界为 $l + 1$。证明见如下构造过程,有点脑筋急转弯的感jio:
将点分为叶子节点和非叶子节点,非叶子节点个数 $\leq \frac{n}{2}$ 个,每层非叶子节点必然可以同色,考虑从上往下填色,每层的非叶子节点先填同一种颜色,然后同层的叶子节点尽量填该层非叶子节点的颜色,若填完了就填另一种。
$CF827F-Dirty Arkady’s Kitchen$
策略是反复横跳。设「最小时刻」的 dp 状态是不对的,因为如果来的边 ban 掉,又没有邻边存在,就会挂。
按出现时间从小到大加边,堆维护,$f[x, 0/1]$ 表示在偶/奇时刻到达 $x$ 点的最大时刻,那么加入的边出现时间只要 $\leq f[x, 0/1]$ 就可以拓展,否则 $> f[x, 0/1]$ 就先放在 $x$ 的 vector 里,等到什么时候 $f[x, 0/1]$ 更新了才拓展(更新 $f[x, 0/1]$ 一定是之后的边的 $r$,一定大于当前边的 $l$,所以一定可以拓展)。因为边有序,vector 也有序。显然你不用考虑删边了。
这样一条边最多被考虑两次,复杂度 $O(nlogn)$。
$CF1550D-Excellent Arrays$
卡点很奇怪的一道题(?
设 $k_i = a_i - i$,那么 $k_i = -k_j$ 的对贡献 $1$,也就是说按 $|k_i|$ 划分,每个部分内部贡献的和最大
然后我到这儿就卡住了
显然可以划分为一个集合,其中一半 $+k$,一半 $-k$,因此 $F(a) = (n/2)^2$
不同 $k$ 的贡献计算方式不同。
$k \leq min(1 - l, r - n)$:偶长度序列答案为 $\binom{n}{n/2}$,奇长度序列答案为 $\binom{n}{n/2} + \binom{n}{(n/2) + 1}$,就考虑选了哪些为 $+k$
$k > min(1 - l, r - n)$:设 $lf = max(1, l + k) + 1$, $rg = min(n, r - k) - 1$
$i \in [1, lf)$ 只能选 $+k$, $i \in (rg, n]$ 只能选 $-k$。稍微推一下得到,偶长度序列答案为 $\binom{rg - lf + 1}{(n/2) - lf + 1}$, 奇长度序列答案为 $\binom{rg - lf + 1}{(n/2) - lf + 1} + \binom{rg - lf + 1}{(n/2) + 1 - lf + 1}$这部分复杂度是合法 $k$ 的个数,是多少呢?$k$ 每 $+1$,$lf++$、$rg—$,直到 $rg - lf + 1 \leq 0$,一共是 $O(n)$ 个 $k$。
$CF1550E-Stringforces$
满足二分性。check 考虑贪心的把大小为 $lim$(二分值)的块尽量往左放,看能否 fit
每种字符都要出现,于是状压 dp 加块顺序。预处理每个位置往后每种字符最近的长度合法的连续段的结束位置。
若当前位置 $i$ 可以放某种颜色的块,当且仅当其他所有颜色上一次出现位置都 $\geq i + lim$
$CF1550F-Jumping Around$
喵题(但似乎没有很大的难点)
首先肯定不能每次判断。由于能跳到每个位置的最小 $k$ 具有单调性,考虑预处理每个位置被到达的最小 $k$。
考虑两两连边,边权 $w$ 为互相到达的最小 $k$,显然 $w = | d - | a_u - a_v | |$
那么两个点可互达的最小 $k$ 就可以用 kruskal 重构树算,其实就是建 MST 啦
怎么建 MST 啊?这是完全图!kruskal 暴毙,prim $n^2$,而 boruvka 可以,因为这里距离的计算方式比较特殊
用 set 维护所有点的坐标。处理当前块时,将 set 中当前块的坐标清出去,这样复杂度才对。$O(nlog^2n)$。
$CF283E$
不合法的三元组一定是存在一头牛可以打败另外两头
$d_i$ 表示第 $i$ 头牛能打败 $d_i$ 头牛
$ans = \binom{n}{3} - \sum\limits_{i = 1}^n \binom{d_i}{2}$
$d_i$ 的区间一定包含 $i$,因此将区间按左右端点升序排列,依次反转区间(SGT 维护 tag),扫到 $i$ 为左端点时统计 $[i + 1, n]$ 中被反转了奇数次的和 $[1, i - 1]$ 中被反转了偶数次的。
$CF1400F$
盲猜 x-prime 区间很少,跑一跑
咦为什么我 num = 19 只有 870?题解说 2400
诶不管了,总之就是 dp, $dp[i, j]$ 表示考虑前 $i$ 个字符在 AC 自动机状态 $j$ 的最少删除个数
$CF1528D$
形式化:$u \rightarrow v$,等一秒就变成 $u \rightarrow v + 1$,其实可以看作 $v \rightarrow v + 1$。连边跑 dij 即可。
注意 dij 扩展到的点,最短路已经确定,要根据最短路的 dis 确定当前边真正的终点。
细节:由于是个边数 $n^2$ 级别的稠密图,dij 不用堆会更快哦。
$CF587F$
$CF547E$ 的孪生姊妹。
哦说到那题,一种做法是离线询问、建立 AC 自动机并用 BIT 维护 fail 树,另一种做法是直接把串拼起来,就变成询问一个区间内某串出现次数的 SAM + 线段树合并板子题。
再来看这题,似乎直接思考没有靠谱做法?
暴力做法是在 ACAM 上跑 $s_k$,统计 fail 树上到根路径上是 $s_{l \cdots r}$ 的结尾的点的个数。
考虑根号分治:
- 长度 $< \sqrt{n}$ 的用暴力做法。
- 长度 $> \sqrt{n}$ 的只有 $\sqrt{n}$ 个串,可以预处理每个串在它里面出现的次数。
$CF603E$
假设你已经知道了判定方法,然后来个删边并查集 + cdq 分治即可。
现在问题是,判定方法/充要条件是啥?每个连通块点数为奇。
考虑加入一条边会使得奇度点个数 $+2$,不变或 $-2$,必要条件是每个连通块点数都为偶。
充分性考虑构造一个偶数个点的连通块的合法边集:选个生成树,从下往上删即可!!
于是你就可以将边升序排序后 cdq 啦!
当前时间 $[l, r]$,边权 $[x, y]$
假设当前已经加入了时间在 $[1, l)$ 且边权在 $[1, x)$ 的所有边
只要求出 $ans_{mid}$ 就可以递归到 $(l, mid - 1, ans_{mid}, y)$ 和 $(mid + 1, r, x, ans_{mid})$
先将 $[l, mid]$ 中边权 $[1, x)$ 的所有边加入,然后按边权从小往大加到所有连通块点数都为偶为止。
$O(mlogmlogn)$,每条边被加入删除它的深度次,$logn$ 是删边并查集的复杂度。